/* PlaceObject.h
 * 
 *  Author          : Alexander J. Yee
 *  Date Created    : 11/20/2014
 *  Last Modified   : 04/08/2017
 * 
 */

#pragma once
#ifndef ymp_TemplateTools_PlaceObject_H
#define ymp_TemplateTools_PlaceObject_H
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#include <new>
#include <utility>
#include <type_traits>
#include "PublicLibs/CompilerSettings.h"
namespace ymp{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
template <typename T, class... Args>
YM_FORCE_INLINE T& place_trivial_object(void* mem, Args&&... args){
    static_assert(
        std::is_trivially_destructible<T>::value,
        "Object must be trivially destructible."
    );
    return *::new (mem) T(std::forward<Args>(args)...);
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}
#endif
